DA
tfs 0.3.6

Erro em script (sem erro no distro)

Por Darkraus, 17 de fev. de 2016 em Scripts

script infuncional
13
2k
DarkrausD
17 de fevereiro de 2016 às 00:31

Bom dia/tarde/noite.

pra ser direto ao ponto... Eu tive uma ideia de um sistema muito interessante para meu servidor.

após algum tempo estudando formas de faze-lo eu descobri uma forma (bem feia) de fazer.

Após algum tempo trabalhando no script cheguei a um resultado... porém não funcional vejamos:

 

Primeiro a ideia: esse script ,era pra ser bem simples, seria uma skill target que quando atingisse o inimigo deixaria nele um storage value por determinado tempo.

sairia um texto animado por puro capricho. passado o tempo esse storage value seria removido e sairia outro texto animado.

Esse sistema que pretendo fazer funcionaria somente se o player tivesse equipado com um item, mas tornou-se muito mais problematico do que eu imaginava.

 

vou postar os 2 pois acredito que o erro seja o mesmo então... não muda muito haha.

 

Verifica se X item está equipado:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2, -1, -3, -2)


local inimigo = {}
local escudo = 2520
local slot1 = getPlayerSlotItem(getCreatureTarget(cid), 5)
local slot2 = getPlayerSlotItem(getCreatureTarget(cid), 6)
local storage = 199901

function onCastSpell(cid, var)
         table.insert(inimigo, getCreatureTarget(cid))
                 if isPlayer then
                   if slot1 or slot2 == 2520 then
           	       setPlayerStorageValue(#inimigo, storage, 1)
                   doSendAnimatedText(getCreaturePosition(cid), 'Charged', 180)
                         else
                         return doCombat(cid, combar, var)
                   end
                       addEvent(function()
                           if isCreature(cid) then
                           setPlayerStorageValue(#inimigo, storage, 0)
                           doSendAnimatedText(getCreaturePosition(cid), 'Charge lost', 180)
                           end
                   end,4000)
                return doCombat(cid, combat, var)
                 end
                end

 

Não verifica se item está equipado:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2, -1, -3, -2)


local inimigo = {}
local storage = 199901

function onCastSpell(cid, var)
         table.insert(inimigo, getCreatureTarget(cid))
                 if isPlayer then
           	       setPlayerStorageValue(#inimigo, storage, 1)
                   doSendAnimatedText(getCreaturePosition(cid), 'Charged', 180)
                         else
                         return doCombat(cid, combat, var)
                         end
            addEvent(function()
                 if isCreature(cid) then
                    setPlayerStorageValue(#inimigo, storage, 0)
                    doSendAnimatedText(getCreaturePosition(cid), 'Charge lost', 180)
                 end
            end,4000)
return doCombat(cid, combat, var)
                 end

O que me intriga muito nos 2 scripts é o fato de não ter nenhum erro no debugger (OtScriptLive) e nem no distro do servidor.

o unico erro aparente é quano o player usa que aparece o erro avisando que o player está sem mana...

porém baixei o custo de mana da magia pra 0 e testei em 2 personagens com mais de 5k de mana...

eu sou um scripter iniciante (MUITO iniciante... NOVATO... NEWBA) portanto deve ser um erro ridiculo...

alguem tem alguma solução? haha

Night WolfN
17 de fevereiro de 2016 às 01:27

de cara o erro q se enxerga é vc utilizando a função isPlayer(uid) sem o parâmetro.. vc quer verificar se o inimigo é um player?

outra coisa.. setPlayerStorageValue(#inimigo, storage, 1) isso daqui não existe pois #inimigo retorna o numero de elementos numa tabela.

DarkrausD
17 de fevereiro de 2016 às 01:47

não entendi bem o paramentro do isPlayer...

já a parte do #inimigo, eu procurei alguma forma de armazenar um dado no script pra usar no addevents,

pq se eu usasse getCreatureTarget(cid) no addevents se o player mudasse o target poderia gerar algum bug...

na verdade pode ter sido uma interpretação completamente errônea de um script q eu vi na seção de pedidos que inclusive é seu.

mas nele vc usava table.insert para que o script memorizasse uma posição...

se essa forma não funciona, qual outra forma eu poderia usar para que o player que recebeu a spell fosse memorizado no script podendo ser usado novamente?

Night WolfN
17 de fevereiro de 2016 às 02:40

olha, vc não pode usar cid até ele ser declarado e ele só é declarado depois de function onCastSpell.. então nada disso daqui vai funcionar:

local slot1 = getPlayerSlotItem(getCreatureTarget(cid), 5)
local slot2 = getPlayerSlotItem(getCreatureTarget(cid), 6)

isCreature/isPlayer/isMonster verificam se determinado uid é criatura/player/monstro.. o parâmetro é o uid.

Pra quem executa os callbacks, nós chamamos o uid de cid, mas pode ser muito bem isPlayer(getCreatureTarget(cid).uid)
-- verifica se assim funciona.. vc só tem que colocar target = "1" na tag do spells.xml

variantToNumber(var) representa o target.
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2, -1, -3, -2)

local escudo = 2520
local storage = 199901

function onCastSpell(cid, var)
	if isPlayer(variantToNumber(var)) then
		local slot1 = getPlayerSlotItem(variantToNumber(var), 5)
		local slot2 = getPlayerSlotItem(variantToNumber(var), 6)
		if slot1 or slot2 == escudo then
			setPlayerStorageValue(variantToNumber(var), storage, 1)
			doSendAnimatedText(getCreaturePosition(cid), 'Charged', 180)
		end
		addEvent(function()
			if isCreature(cid) then
				setPlayerStorageValue(variantToNumber(var), storage, 0)
				doSendAnimatedText(getCreaturePosition(cid), 'Charge lost', 180)
			end
		end,4000)		
	end
return doCombat(cid, combat, var)
end

 

DarkrausD
17 de fevereiro de 2016 às 02:53

Poderia me explicar brevemente o que variantToNumber(var) faz exatamente?

 

porque eu fiz aquela tentativa porque se o player TROCAR o target no tempo do addevents ele poderia usar o target novo para remover o storage

fazendo com que o player anterior que recebeu o storage ficasse com ele pra sempre... configurando um bug.

mas eu não conheço nem de nome essa variantToNumber(var).

ficaria grato se pudesse me explicar.

 

olha, vc não pode usar cid até ele ser declarado e ele só é declarado depois de function onCastSpell.. então nada disso daqui vai funcionar:

local slot1 = getPlayerSlotItem(getCreatureTarget(cid), 5)
local slot2 = getPlayerSlotItem(getCreatureTarget(cid), 6)

de qualquer forma, essas poucas palavras já valeram o topico. algo que eu não sabia e provavelmente nunca ia desconfiar.

Night WolfN
17 de fevereiro de 2016 às 04:01

eu tinha explicado ali:
variantToNumber(var) representa o target.
----- o var da spell pode me retornar o uid do target através dessa função variantToNumber(var)

Tem algumas discussões sobre isso aqui no xt, só procurar o tópico do @@Skulls

Editado Fevereiro 17 por Night Wolf

DarkrausD
17 de fevereiro de 2016 às 08:33

hm, achei q ela se adequaria a essa função somente nesse scrit e semelhantes.

mas se é a função dela, é um otimo elemento no arsenal haha.

já dei rep em todos as respostas aqui, muito obrigado pela atenção e suporte :)

 

-edit

uma duvida rapida: qual distro você prefere programar? notei que a maioria dos scripters usam a 0.3.6 do tfs porém, ela parece bem limitada em relação ao 1.2... fico em duvida em relação a isso.

Editado Fevereiro 17 por Darkraus

Night WolfN
17 de fevereiro de 2016 às 17:10
Melhor resposta

quanto mais atual, mais recursos.. porém TFS 1.2 é MUITO diferente de 0.36... eu uso aqui em casa dois servidores (0.36 e 0.4)

DarkrausD
18 de fevereiro de 2016 às 01:00

Wolf, sem querer abusar da sua pessoa, se ainda estiver acompanhando este topico, poderia me esclarecer uma duvida?

seguinte :

 

quando uso a função onStatsChange


(cid, attacker, type, combat, value)

a função possui o parametro "attacker", este parametro pode ser usado posteriormente em algums funções no lugar do cid?

ou possui outra forma de vc declarar quem ataca o player?

Night WolfN
18 de fevereiro de 2016 às 03:21

vc pode usar no lugar do cid pra fazer a função para quem te ataca, só lembra de dar if isCreature(attacker) pra checar se o attacker não é um uid de fire field por exemplo, porque esse callback é executado toda vez que o player tem vida/mana mudados. Aí é recomendável vc tb verificar o type pra garantir que seu código só vai executar em casos específicos (qnd perder vida ou mana, por ex)

Editado Fevereiro 18 por Night Wolf

DarkrausD
18 de fevereiro de 2016 às 03:51

hm, se eu entendi bem... isso funcionaria :

            if isCreature(attacker) then
            doSendMagicEffect(getCreaturePosition(attacker), 9)
            doAddCondition(attacker, venom)
            end

certo?

 

verificar se o "atacante" é criatura, verificar a posição do atacante e até mesmo adicionar uma condição ao atacante.

desde claro que a função onStatsChange seja declarada antes, correto?

Night WolfN
18 de fevereiro de 2016 às 03:53

sim, e vc tem que criar a condition venom tb.. da mesma forma q vc cria em spells

FurabioF
18 de fevereiro de 2016 às 09:04

Tópico Movido
Este tópico foi movido de "OTServScriptingSuporte Scripting"
para "OTServScriptingSuporte ScriptingPedidos e dúvidas resolvidos - Scripting".